package kr.co.bettersoft.carrotmemberstore.activity;
/**
 * RegisterPage2
 * 등록 2번째 화면
 */

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Locale;

import org.apache.http.util.EncodingUtils;
import org.json.JSONObject;

import kr.co.bettersoft.carrotmemberstore.R;
import kr.co.bettersoft.carrotmemberstore.adapter.PostAddressListAdapter;
import kr.co.bettersoft.carrotmemberstore.common.CarrotMemberStoreRest;
import kr.co.bettersoft.carrotmemberstore.common.CommonConstant;
import kr.co.bettersoft.carrotmemberstore.domain.PostAddress;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

public class RegisterPage2 extends Activity {

	String TAG = "RegisterPage2";
	final int REQUEST_ADDRESS = 401;	// @@@ 

	RegisterPage registerPage = (RegisterPage)RegisterPage.registerPage;

	// 로케일
	Locale systemLocale = null;
	String strCountry = "";
	String strLanguage = "";


	// 서버 통신용
	CarrotMemberStoreRest carrotMemberStoreRest;
	String callResult = "";
	String tempstr = "";
	JSONObject jsonObject;

	Boolean connected = false;
	Boolean nowLoading = false;			// 공지 가져오는 중에 재 요청 안하도록
	Boolean webPageLoaded = false;		// 공지 갱신없이 한번만 통신하도록 

	// ajax 통신용.
	public  HttpURLConnection m_con ;
	public String m_request ;
	OutputStream out = null;

	// 웹뷰용
	String COUNTRY_CODE, lan;
	String leftUrl;
	String postData = "";

//	// 우편번호
	String zipCodeURL = CommonConstant.zipCodeURL;	
	String searchWord;
//	String searchResult;
//	String ZIPCODE;			// zipcode , sido, bunji, GUGUN
//	String SIDO ;			// zipcode , sido, bunji, GUGUN
//	String GUGUN ;			// zipcode , sido, bunji, GUGUN
//	String DONG ;			// zipcode , sido, bunji, GUGUN
//	String BUNJI ;			// zipcode , sido, bunji, GUGUN
	String zCode;			//Log.d(TAG,ZIPCODE+" "+SIDO+" "+GUGUN+" "+DONG+" "+BUNJI);
	String address;

	// 화면 구성
	View rightLayout;
	Button searchBtn;	//
	TextView searchWordView;
	WebView registerWebViewLeft;
	ListView listView;								// 산출물 보여줄 뷰
	View emptyView;				// 데이터 없음 뷰
	// 진행바
	ProgressBar pb1, pb2;		// 중단 로딩 진행바
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout, register2_right_layout;
	InputMethodManager imm;

	// 아답터
	PostAddressListAdapter addressAdapter;

	List<PostAddress> entriesFn;			// 최종 산출물

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();	
				if(b.getInt("showYN")==1){		// 받아온 마일리지 결과를 화면에 뿌려준다.
					//					Log.d(TAG,"showYN");
					searchWordView.setEnabled(true);
					// 최종 결과 배열은 entriesFn 에 저장되어 있다.. 여기 리스트 레이아웃.
					searchWordView.setText("");
					if((entriesFn!=null)&&(entriesFn.size()>0)){
						setListing();
						//						listView.setEnabled(true);			// 그리드 뷰 허용함.
					}else{
						if(listView==null){
							listView  = (ListView)findViewById(R.id.register_page2_listview);
						}
						emptyView = findViewById(R.id.register_page2_empty1);		// 데이터 없으면 '빈 페이지'(데이터 없음 메시지)표시		// ...
						listView.setEmptyView(emptyView);
						listView.setVisibility(8);			//   0 visible   4 invisible   8 gone
						emptyView.setVisibility(0);
					}
					hidePb2();
				}else if(b.getInt("showYN")==2){
					addressAdapter.notifyDataSetChanged();
					searchWordView.setEnabled(true);
				}
				if(b.getInt("showRightView")==1){		// 우측 창 보임.
					rightLayout.setVisibility(View.VISIBLE);
				}else if(b.getInt("showRightView")==2){								// 우측 창 안 보임.
					rightLayout.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("order")==3){
					// 프로그래스바 실행
					pb2.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==4){
					// 프로그래스바  종료
					pb2.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())							
					.setTitle(CommonConstant.alertTitle)						 
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		 
					.setPositiveButton("OK", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(RegisterPage2.this, R.string.failed_to_open_page, Toast.LENGTH_SHORT).show();			// "페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다."
				}

				switch (msg.what)
				{
				case REQUEST_ADDRESS : runOnUiThread(new RunnableRequest());		 
				break;
				default : 
					break;
				}	

			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w(TAG,"onCreate");
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.register_page2);

		carrotMemberStoreRest = new CarrotMemberStoreRest(); 
		
		Intent getIntent = this.getIntent();
		leftUrl = getIntent.getStringExtra("leftUrl");
		COUNTRY_CODE = getIntent.getStringExtra("COUNTRY_CODE");
		lan = getIntent.getStringExtra("lan");
		Log.w(TAG,"COUNTRY_CODE : "+COUNTRY_CODE);
		Log.w(TAG,"lan : "+lan);

		//사용자 지역, 언어
		systemLocale = getResources().getConfiguration().locale;
		strCountry = systemLocale.getCountry();
		strLanguage = systemLocale.getLanguage();

		registerWebViewLeft = (WebView) findViewById(R.id.register2_webview_left);
		searchWordView = (TextView) findViewById(R.id.register_page2_text_search_address);

		registerWebViewLeft.setWebViewClient(new MyWebViewClientLeft());
		registerWebViewLeft.setWebChromeClient(new MyWebChromeClientLeft());  // MyWebChromeClient 지정         -- javascript 사용 됨. 
		registerWebViewLeft.addJavascriptInterface(new AndroidBridgeLeft(), "hybrid");
		WebSettings webSet3 = registerWebViewLeft.getSettings();		// JavaScript 허용.
		webSet3.setJavaScriptEnabled(true);

		rightLayout  = findViewById(R.id.register2_right_layout);

		pb1=(ProgressBar) findViewById(R.id.register2_progressbar1);
		pb2=(ProgressBar) findViewById(R.id.register2_progressbar2);

		searchBtn = (Button) findViewById(R.id.register_page2_btn_search_address);		
		// 버튼  리스너.
		searchBtn.setOnClickListener(new OnClickListener() {		// 우측 검색 버튼.
			@Override
			public void onClick(View v) {
				Log.w(TAG,"searchBtn click");
				searchWord = searchWordView.getText()+"";
				if(searchWord.length()>0){
					showPb2();
					searchWordView.setEnabled(false);
//					new backgroundRequest().execute();	
					handler.sendEmptyMessage(REQUEST_ADDRESS);
				}else{
					showResultDialog(getString(R.string.post_address_no_input_msg));
				}
			}
		});

		parentLayout = findViewById(R.id.register2_parent_layout);		// 부모 레이아웃- 리스너를 달아서 키보드 자동 숨김에 사용
		register2_right_layout = findViewById(R.id.register2_right_layout);
		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(searchWordView.getWindowToken(), 0);
			}
		});
		register2_right_layout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(searchWordView.getWindowToken(), 0);
			}
		});
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 데이터를 화면에 세팅
	/**
	 * setListing
	 *  데이터를 화면에 세팅한다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	public void setListing(){
		Log.d(TAG,"setListing/"+entriesFn.size());
		addressAdapter = new PostAddressListAdapter(this, entriesFn);
		listView  = (ListView)findViewById(R.id.register_page2_listview);
		listView.setDivider(null);			// 라인 제거
		listView.setAdapter(addressAdapter);

		// 클릭시 왼쪽으로 데이터 전달.
		listView.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {

				zCode = entriesFn.get(position).getZipcode();
				address = entriesFn.get(position).getSido()+" "+entriesFn.get(position).getGugun()+" "+entriesFn.get(position).getDong()+" "+entriesFn.get(position).getBunji();
				runOnUiThread(new Runnable(){
					public void run(){
						registerWebViewLeft.loadUrl("javascript:jsUpdateZipcode('" + zCode + "', '"+ address +"');");
						registerWebViewLeft.getSettings().setJavaScriptEnabled(true);
					}
				});

				hideRightView();
				showResultDialog(getString(R.string.post_address_searched));
			}
		});
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 우편번호 검색

	/**
	 * 러너블. 고객 마일리지 리스트를 가져온다.
	 */
	class RunnableRequest implements Runnable {
		public void run(){
			new backgroundRequest().execute();
		}
	}
	/**
	 * backgroundRequest
	 *  비동기로 우편번호 정보를 얻어온다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	public class backgroundRequest extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) { 
			
			// 파리미터 세팅
			// 호출
			showPb2();
			callResult = carrotMemberStoreRest.RestRequestAddress(zipCodeURL, searchWord);
			hidePb2();
			// 결과 처리
			if(callResult.equals("S")){
				entriesFn = carrotMemberStoreRest.getPostAddressEntriesFn();
			}
			showInfo();
			return null; 
		}
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 웹뷰 관련

	/**
	 * Bridge Class
	 * 웹페이지로부터 요청을 받아서 처리한다.
	 */
	private class AndroidBridgeLeft {
		// 액티비티 종료
		/**
		 * finishActivity
		 *  액티비티 종료한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void finishActivity() {
			handler.post(new Runnable() {
				public void run() {
					//					registerPage.finish();
					registerPage.finishThis();
					finish();
				}
			});
		}
		// 주소찾기를 누르면 우측에 우편번호 검색 창을..			 *** 
		/**
		 * callRightPage
		 *  주소찾기를 누르면 우측에 우편번호 검색 창을보여준다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void callRightPage(){
			if(entriesFn!=null){
				entriesFn.clear();		// 기존 데이터 초기화.
				updateInfo();
			}
			showRightView();
			// 주소찾기를 누르면 우측에 우편번호 검색 창을..  보여준다.
		}
	}
	/**
	 * MyWebViewClientLeft
	 * 페이지 로드, 완료 이벤트발생 가능한 웹뷰 클라이언트
	 *
	 */
	private class MyWebViewClientLeft extends WebViewClient {							// 웹뷰 추가 될 경우 MyWebViewClientRight 로 복사하여 쓸것.
		@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return super.shouldOverrideUrlLoading(view, url);  
		}
		/**
		 * onPageFinished
		 * 로딩 끝나면 프로그래스바 숨기고 재로딩 가능하도록한다
		 *
		 * @param view
		 * @param url
		 * @return
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			hidePb1();
			webPageLoaded = true;
			nowLoading = false;
		}
		/**
		 * onPageStarted
		 * 웹뷰 로딩 시작하면 시간 재서 로딩 안되면 멈추고 알린다.
		 *
		 * @param view
		 * @param url
		 * @param favicon
		 * @return
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			showPb1();
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(CommonConstant.webPageLoadingMaxTime);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}finally{
						runOnUiThread(new Runnable(){
							public void run(){
								if(registerWebViewLeft.getProgress()<100) {
									// do what you want
									registerWebViewLeft.stopLoading();
									hidePb1();
									showErrMsg();
									finish();
								}
							}
						});
						nowLoading = false;
					}


				}
			}).start();
		}
	}

	/**
	 * MyWebChromeClientLeft
	 *  자바스크립트 alert 사용 위한 크롬 클라이언트이다
	 *
	 */
	private class MyWebChromeClientLeft extends WebChromeClient {			// 웹뷰 하나 더 추가될 경우 MyWebChromeClientRight 로 복사해서 쓸것.
		//Javascript alert 실행 가능함
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			final JsResult finalRes = result;
			//AlertDialog 생성
			new AlertDialog.Builder(view.getContext())
			.setMessage(message)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finalRes.confirm(); 
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	public Context returnThis(){
		return this;
	}


	/**
	 * showInfo
	 * entries3 를 전역에 저장후 스레드 이용하여 돌린다. 화면에 보여준다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * updateInfo
	 * 얻어온 정보를 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void updateInfo(){			// 초기화.
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 2);		// 초기화.
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}


	// 우측 창 보임. 숨김
	/**
	 * showRightView
	 *  우측 창  가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showRightView(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "showRightView" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hideRightView
	 *  우측 창 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hideRightView(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "showRightView" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb1
	 *  좌중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb1(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb1
	 *  좌중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb1(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showPb2
	 *  우중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb2(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 3);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb2
	 *  우중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb2(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 4);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}			
		).start();
	} 

	//얼럿을 띄운다.  하단 버튼은 "OK" 로 통일.
	/**
	 * showResultDialog
	 *  얼럿을 띄운다
	 *
	 * @param msg
	 * @param
	 * @return
	 */
	public void showResultDialog(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * CheckNetwork
	 *  네트워크 상태 감지한다
	 *
	 * @param
	 * @param
	 * @return connected
	 */

	public Boolean CheckNetwork(){
		ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		boolean isWifiAvailable = ni.isAvailable();
		boolean isWifiConn = ni.isConnected();
		ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		boolean isMobileAvail = ni.isAvailable();
		boolean isMobileConn = ni.isConnected();

		String status = "WiFi Avail="+isWifiAvailable+"//Conn="+isWifiConn
		+"//Mobile Avail="+isMobileAvail
		+"//Conn="+isMobileConn;
		if(!(isWifiConn||isMobileConn)){
			Log.w(TAG,status);
			new Thread( 
					new Runnable(){
						public void run(){
							Message message = handler .obtainMessage();
							Bundle b = new Bundle();
							b.putInt( "showNetErrToast" , 1);
							message.setData(b);
							handler .sendMessage(message);
						}
					}
			).start();
			hidePb1();
			hidePb2();
			connected = false;
		}else{
			connected = true;
		}
		return connected;
	}

	/**
	 * onPause
	 *  액티비티 pause 시 웹뷰 재로드 가능하게 한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onPause(){
		webPageLoaded = false;
		super.onPause();
	}

	/**
	 * onResume
	 *  액티비티 리쥼시 웹뷰 재로딩한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		if(CheckNetwork()){
			if(!webPageLoaded && !nowLoading){
				nowLoading = true;
				// 비동기 -> 그냥 호출
				postData = "COUNTRY_CODE="+COUNTRY_CODE+"&lan="+lan;				// 파라미터 : COUNTRY_CODE , lan
				String url = "";
				url = (CommonConstant.domain).concat("/").concat(leftUrl);
				registerWebViewLeft.postUrl(url, EncodingUtils.getBytes(postData, "BASE64"));	
			}
		}else{
			showErrMsg();
			finish();
		}
	}

}
